{%- set uses_sqlite = cookiecutter.use_sql_sqlite in ('y', 'yes') -%} {# 检查是否使用SQLite #}
{%- set uses_mysql = cookiecutter.use_sql_mysql in ('y', 'yes') -%} {# 检查是否使用MySQL #}
{%- set uses_sql = uses_mysql or uses_sqlite -%} {# 检查是否使用任何SQL数据库 #}
{%- set uses_socketio = cookiecutter.use_socketio in ('yes', 'y') -%} {# 检查是否使用SocketIO #}
import os
{# 如果使用SQL数据库，导入SQLAlchemy和迁移工具 #}
{% if uses_sql %}
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
{%- endif -%}
{# 如果使用安全模块，导入Flask-Security相关组件 #}
{%- if cookiecutter.use_security in ('yes', 'y') %}
from flask_security import Security
from flask_security import SQLAlchemyUserDatastore
{%- endif -%}
{# 如果使用管理后台，导入Flask-Admin #}
{%- if cookiecutter.use_admin in ('yes', 'y') %}
from flask_admin import Admin
{%- endif -%}
{# 如果使用REST API，导入Marshmallow #}
{%- if cookiecutter.use_rest in ('yes', 'y') %}
from flask_marshmallow import Marshmallow
{%- endif %}
{# 如果使用SocketIO，导入相关扩展 #}
{%- if uses_socketio %}
from flask_socketio import SocketIO
{%- endif %}
{# 如果使用异步任务，导入RQ任务队列 #}
{%- if cookiecutter.use_async_tasks in ('yes', 'y') %}
from flask_rq2 import RQ
{%- endif %}
{# 如果使用静态文件服务，导入压缩扩展 #}
{%- if cookiecutter.serve_static_files in ('yes', 'y') %}
from flask_static_compress import FlaskStaticCompress
{% endif %}

{# 调试工具栏初始化为None #}
toolbar = None

{# 仅在开发模式下启用调试工具栏 #}
if os.environ['FLASK_ENV'] == 'development':
    # 仅在开发模式下工作
    from flask_debugtoolbar import DebugToolbarExtension
    toolbar = DebugToolbarExtension()

{# 初始化SQL数据库扩展 #}
{% if uses_sql %}
db = SQLAlchemy()  # SQLAlchemy数据库实例
migrate = Migrate(db=db)  # 数据库迁移工具
{% endif -%}
{# 初始化管理后台扩展 #}
{%- if cookiecutter.use_admin in ('yes', 'y') -%}
admin = Admin()  # Flask-Admin管理后台实例
{% endif -%}
{# 初始化REST API扩展 #}
{%- if cookiecutter.use_rest in ('yes', 'y') -%}
ma = Marshmallow()  # Marshmallow序列化工具
{% endif -%}
{# 初始化静态文件压缩扩展 #}
{%- if cookiecutter.serve_static_files in ('yes', 'y') -%}
compress = FlaskStaticCompress()  # 静态文件压缩工具
{% endif -%}
{# 初始化SocketIO扩展 #}
{%- if cookiecutter.use_async_tasks in ('yes', 'y') -%}
io = SocketIO()  # SocketIO实时通信实例
{% endif -%}
{# 初始化异步任务队列扩展 #}
{%- if cookiecutter.use_async_tasks in ('yes', 'y') -%}
rq = RQ()  # Redis任务队列实例
{% endif -%}
{# 初始化安全模块扩展 #}
{% if cookiecutter.use_security in ('yes', 'y') -%}
security = Security()  # Flask-Security安全模块实例


def security_init_kwargs():
    """
    返回安全扩展初始化所需的参数
    由"empty"包在安全扩展初始化时使用
    """
    from auth.models import User, Role  # 导入用户和角色模型

    # 创建SQLAlchemy用户数据存储
    user_datastore = SQLAlchemyUserDatastore(db, User, Role)
    return dict(datastore=user_datastore)  # 返回包含数据存储的字典
{% endif -%}